﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using PlanoAula.BD;
using PlanoAula.Services;
using Google.GData.Calendar;

namespace PlanoAula.Repository
{
    public interface IDiaNaoUtilRepository : IGenericRepository<DiaNaoUtil, dbDataContext>
    {
        int ApagarTodosDoMes(int ano, int mes);
        int ApagarTodosDoAno(int ano);
        int CopiarFeriadosParaOAno(int anoOrigem, int anoDestino);
        void ImportarCalendarioDoGoogle(string url, string email, string senha, DateTime de, DateTime ate, bool sobrescreverExistente = false);

        List<DiaNaoUtil> GetItemsAno(int ano);
        List<DiaNaoUtil> GetItemsMesAno(int ano, int mes);
        bool EhDiaNaoUtil(DateTime Data);
    }


    public class DiaNaoUtilRepository : GenericRepository<DiaNaoUtil, dbDataContext>, IDiaNaoUtilRepository
    {
        /*
        private static DiaNaoUtilRepository _instance;
        public static DiaNaoUtilRepository Instance { get { if (_instance == null) _instance = new DiaNaoUtilRepository(); return _instance; } }
        */
        public int ApagarTodosDoMes(int ano, int mes)
        {
            using (dbDataContext db = new dbDataContext())
            {
                (from dia in db.DiaNaoUtil
                 where dia.Data.Month == mes &&
                 dia.Data.Year == ano
                 select dia
                ).ToList().ForEach(o => db.DiaNaoUtil.Remove(o));
                return db.SaveChanges();
            }
        }

        public int ApagarTodosDoAno(int ano)
        {
            using (dbDataContext db = new dbDataContext())
            {
                (from dia in db.DiaNaoUtil
                 where dia.Data.Year == ano
                 select dia
                ).ToList().ForEach(p => db.DiaNaoUtil.Remove(p));
                return db.SaveChanges();
            }
        }
        public int CopiarFeriadosParaOAno(int anoOrigem, int anoDestino)
        {
            if (anoDestino == anoOrigem) return 0;
            using (dbDataContext db = new dbDataContext())
            {
                var dias = from dia in db.DiaNaoUtil
                           where dia.Data.Year == anoOrigem
                           select dia;

                foreach (DiaNaoUtil dia in dias)
                {
                    db.DiaNaoUtil.Add(new DiaNaoUtil
                    {
                        Data = new DateTime(anoDestino, dia.Data.Month, dia.Data.Day),
                        Descricao = dia.Descricao,
                        Nome = dia.Nome
                    });

                }
                return db.SaveChanges();
            }
        }

        public void ImportarCalendarioDoGoogle(string url, string email, string senha, DateTime de, DateTime ate, bool sobrescreverExistente = false)
        {
            if (string.IsNullOrWhiteSpace(url) || de > ate)
            {
                return;
            }
            var myResultsFeed = GoogleCalendarService.ObterEventoCalendario(url, email, senha, de, ate);
            int qtdAtualizado = 0;
            int qtdNovo = 0;
            foreach (EventEntry feedEntry in myResultsFeed.Entries)
            {
                if (feedEntry.Times.Count == 0)
                {
                    continue;
                }
                DateTime dataFeriado = feedEntry.Times[0].StartTime;

                var dia = (from d in this.GetAll()
                           where d.Data == dataFeriado
                           select d).FirstOrDefault();
                if (dia == null || !sobrescreverExistente)
                {
                    this.Add(new DiaNaoUtil
                    {
                        Id = Guid.NewGuid(),
                        Data = dataFeriado.Date,
                        Nome = String.Format("Feriado dia {0}", dataFeriado.Date.ToShortDateString()),
                        Descricao = feedEntry.Title.Text
                    });
                    qtdNovo++;
                }
                else
                {
                    dia.Data = dataFeriado.Date;
                    dia.Nome = String.Format("Feriado dia {0}", dataFeriado.Date.ToShortDateString());
                    dia.Descricao = feedEntry.Title.Text;
                    qtdAtualizado++;
                }
            }
            this.SaveChanges();
        }

        public List<DiaNaoUtil> GetItemsAno(int ano)
        {
            return GetAll().Where(d => (d.Data.Year == ano)).ToList();
        }
        public List<DiaNaoUtil> GetItemsMesAno(int ano, int mes)
        {
            return GetAll().Where(d => (d.Data.Year == ano && d.Data.Month == mes)).OrderBy(d => d.Data).ToList();
            /*
            (from d in db.DiaNaoUtil
                                                          where (d.Data.Year == ano && d.Data.Month == mes )
                                                          orderby d.Data ascending
                                                          select d)
                                                          .ToList()
             */
        }
        public bool EhDiaNaoUtil(DateTime Data)
        {
            return GetAll().Count(p => p.Data == Data) != 0;
        }
    }
}
